﻿using Library.Classes;
using System.ComponentModel;
using System.Data;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Controls;

namespace Library.Windows
{
    /// <summary>
    /// Логика взаимодействия для Clients.xaml
    /// </summary>
    public partial class Clients : Window, INotifyPropertyChanged
    {
        private bool _editMode = false;
        private static int _id = 0;
        private static Client? _client;
        public Clients()
        {
            InitializeComponent();
            gridClientDetail.DataContext = LoadClients();
            listClients.Items.SortDescriptions.Add(new SortDescription("LastName", ListSortDirection.Ascending));
            lastName.Focus();
        }

        public event PropertyChangedEventHandler? PropertyChanged;

        public void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private static List<Client>? LoadClients()
        {
            DataTable dt = SendToServer.GetClients();
            List<Client> clients = new List<Client>();
            if (dt.Rows.Count != 0)
            {
                foreach (DataRow row in dt.Rows)
                {
                    Client cl = new Client(
                        id: Convert.ToInt32(row[0]),
                        lastName: row[1].ToString(),
                        firstName: row[2].ToString(),
                        birthday: Convert.ToDateTime(row[3]),
                        phone: row[4].ToString(),
                        email: row[5].ToString(),
                        status: Convert.ToBoolean(row[7])
                        );
                    clients.Add(cl);
                }
            }
            return clients;
        }

        private void addClient_Click(object sender, RoutedEventArgs e)
        {
            // Проверяем, что обзательные поля заполнены (фамилия, имя и дата рождения)
            if (firstName.Text == string.Empty || lastName.Text == string.Empty || birthday.Text == "")
            {
                MessageBox.Show("Укажите фамилию, имя и дату рождения", "Заполните обязательные поля",
                    MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            Client cl = new Client(
                id: _id,
                lastName: lastName.Text,
                firstName: firstName.Text,
                birthday: Convert.ToDateTime(birthday.Text),
                phone: phoneNumber.Text,
                email: clientEmail.Text,
                status: true
                );
            if (_editMode)
            {
                // Изменение записи
                if (SendToServer.EditClient(cl))
                {
                    ClearTextBox();     // Очищаем поля ввода
                    UpdateUi();         // Обновляем интерфейс
                    _editMode = false;  // Выходим из режима редактирования
                }
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            else
            {
                if (SendToServer.AddClient(cl))
                    ClearTextBox();     // Очищаем поля ввода
                else
                {
                    MessageError();     // Ошибка операции
                    return;
                }
            }
            // Эта часть кода выполнится, если операция записи (или изменения) будет успешной
            gridClientDetail.DataContext = LoadClients();
        }

        // Сообщение об ошибке записи
        private void MessageError()
        {
            MessageBox.Show("Ошибка записи", "Неудача",
                        MessageBoxButton.OK, MessageBoxImage.Error);
        }

        // Очистка полей ввода (если запись была успешной)
        private void ClearTextBox()
        {
            lastName.Clear();
            firstName.Clear();
            birthday.SelectedDate = DateTime.Now;
            phoneNumber.Clear();
            clientEmail.Clear();
        }

        // Одновление интерфейса после успешной операции обновления данных читателя
        private void UpdateUi()
        {
            GroupHeader.Header = "Добавление нового читателя";
            addClient.Content = "Добавить читателя";
        }

        // Выбор данных из выделенной строки ListBox
        private void listClients_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (listClients.SelectedItems.Count > 0)
            {
                _client = listClients.SelectedItem as Client;
                infoLastName.Text = _client.LastName;
                infoFirstName.Text = _client.FirstName;
                infoBirthday.Text = _client.Birthday.ToString("dd MMMM yyyy");
                infoPhone.Text = _client.Phone;
                infoEmail.Text = _client.Email;
                if (_client.Status)
                {
                    DeleteClient.Header = "Исключить читателя из списка";
                }
                else
                {
                    DeleteClient.Header = "Активировать клиента";
                }
            }
        }

        // Получение данных читателя для изменения и обновления интерфейса
        private void ChangeRow_Click(object sender, RoutedEventArgs e)
        {
            if (listClients.SelectedItems.Count > 0)
            {
                _editMode = true;   // Установка режима редактирования

                GroupHeader.Header = "Обновить данные читателя";
                addClient.Content = "Обновить данные";

                lastName.Text = _client.LastName;
                firstName.Text = _client.FirstName;
                birthday.Text = _client.Birthday.ToString();
                phoneNumber.Text = _client.Phone;
                clientEmail.Text = _client.Email;

                // Получаем идентификатор (id) выделенного читателя
                _id = _client.Id;
            }
        }

        // Удаление клиента из списка
        private void DeleteClient_Click(object sender, RoutedEventArgs e)
        {
            string headerMessage = "";
            string message = "";
            if (_client.Status)
            {
                headerMessage = "Деактивация читателя";
                message = "Деактиваровать читателя?";
            }
            else
            {
                headerMessage = "Активация читателя";
                message = "Активаровать читателя?";
            }

            MessageBoxResult result = MessageBox.Show(message, headerMessage,
                MessageBoxButton.OKCancel, MessageBoxImage.Question);
            if (result == MessageBoxResult.OK)
            {
                bool request = SendToServer.ChangeStatus(_client.Id, _client.Status);
                if (!request)
                    MessageBox.Show("Неудачная попытка изменения статуса",
                        "Ошибка записи данных",
                        MessageBoxButton.OK, MessageBoxImage.Error);
                gridClientDetail.DataContext = LoadClients();
            }
        }
    }
}
